// Tests basic sharding with x509 cluster auth
// The purpose is to verify the connectivity between mongos and the shards

var x509_options = {
    sslMode: "requireSSL",
    sslPEMKeyFile: "jstests/libs/server.pem",
    sslCAFile: "jstests/libs/ca.pem",
    sslClusterFile: "jstests/libs/cluster_cert.pem",
    sslAllowInvalidHostnames: "",
    clusterAuthMode: "x509"
};

// Start ShardingTest with enableBalancer because ShardingTest attempts to turn
// off the balancer otherwise, which it will not be authorized to do. Once SERVER-14017
// is fixed the "enableBalancer" line could be removed.
var st = new ShardingTest({
    name: "sharding_with_x509",
    shards: 2,
    mongos: 1,
    other: {
        enableBalancer: true,
        configOptions: x509_options,
        mongosOptions: x509_options,
        rsOptions: x509_options,
        shardOptions: x509_options
    }
});

st.s.getDB('admin').createUser({user: 'admin', pwd: 'pwd', roles: ['root']});
st.s.getDB('admin').auth('admin', 'pwd');
var coll = st.s.getCollection("test.foo");

st.shardColl(coll, {_id: 1}, false);

// Create an index so we can find by num later
coll.ensureIndex({insert: 1});

print("starting insertion phase");

// Insert a bunch of data
var toInsert = 2000;
var bulk = coll.initializeUnorderedBulkOp();
for (var i = 0; i < toInsert; i++) {
    bulk.insert({my: "test", data: "to", insert: i});
}
assert.writeOK(bulk.execute());

print("starting updating phase");

// Update a bunch of data
var toUpdate = toInsert;
bulk = coll.initializeUnorderedBulkOp();
for (var i = 0; i < toUpdate; i++) {
    var id = coll.findOne({insert: i})._id;
    bulk.find({insert: i, _id: id}).update({$inc: {counter: 1}});
}
assert.writeOK(bulk.execute());

print("starting deletion");

// Remove a bunch of data
var toDelete = toInsert / 2;
bulk = coll.initializeUnorderedBulkOp();
for (var i = 0; i < toDelete; i++) {
    bulk.find({insert: i}).remove();
}
assert.writeOK(bulk.execute());

// Make sure the right amount of data is there
assert.eq(coll.find().count(), toInsert / 2);

// Finish
st.stop();
